package cn.qiao.lock;

import java.io.*;
import java.nio.channels.*;

public class FileLockExample {

    public static String defaultFile = "H:\\Project\\test\\test.txt";


    public static void addLock() {
        RandomAccessFile file = null;
        FileChannel channel = null;
        FileLock lock1 = null;
        FileLock lock2 = null;

        try {
            // 打开文件
            file = new RandomAccessFile(defaultFile, "rw");
            channel = file.getChannel();

            // 尝试获取文件锁第一次
            lock1 = channel.tryLock();
            if (lock1 != null) {
                // 第一次锁定成功
                System.out.println("第一次文件已被锁定");

                // 尝试获取文件锁第二次
                lock2 = channel.tryLock();
                if (lock2 != null) {
                    // 第二次锁定成功，但不应该发生
                    System.out.println("第二次文件已被锁定");
                } else {
                    // 第二次锁定失败
                    System.out.println("第二次文件已被其他进程锁定");
                }
            } else {
                // 第一次锁定失败
                System.out.println("文件已被其他进程锁定");
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (lock1 != null) {
                    lock1.release(); // 释放第一个文件锁
                }
                if (lock2 != null) {
                    lock2.release(); // 释放第二个文件锁
                }
                if (channel != null) {
                    channel.close(); // 关闭文件通道
                }
                if (file != null) {
                    file.close(); // 关闭文件
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    public static boolean isLock() {
        RandomAccessFile accessFile = null;
        FileChannel channel = null;
        FileLock lock = null;
        try {
            // 打开文件
            accessFile = new RandomAccessFile(defaultFile, "rw");
            channel = accessFile.getChannel();
            // 尝试获取文件锁
            lock = channel.tryLock();

            if (lock != null) {
                // 锁定成功，说明文件未被其他进程或线程锁定
                System.out.println("文件未被锁定");
                return false;
            } else {
                // 锁定失败，说明文件已被其他进程或线程锁定
                System.out.println("文件已被锁定");
                return true;
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (lock != null) {
                    lock.release(); // 确保锁被释放
                }
                if (channel != null) {
                    channel.close(); // 关闭文件通道
                }
                if (accessFile != null) {
                    accessFile.close(); // 关闭文件
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return false;
    }


    public static void main(String[] args) {
//        addLock();
//        System.out.println(isLock());
//        addLock();
//        System.out.println(isLock());
//        System.out.println("-------------------------");
        System.out.println(isLock());
    }

}
